# 组合模式

# 组合模式结构中包含如下角色：
# Component: 抽象根节点，为组合中的对象声明接口。在适当情况下，实现所有类共有接口的默认行为。声明一个接口用于访问和管理 Component 子部件。
# Leaf: 叶子节点，实现所有类共有接口的默认行为。
# Composite: 树枝节点/组合节点，管理子部件，负责递归地组合其子部件，实现 Component 接口。
# Client: 使用 Component 接口与组合对象进行交互。

# => ⭐将对象组合成树形结构，表示“部分-整体”的层次结构。

from abc import ABC, abstractmethod

# 组件接口（Component）
class Component(ABC):
    @abstractmethod
    def operation(self):
        pass

    def add(self, component):
        pass

    def remove(self, component):
        pass

    def get_child(self, index):
        pass

# 叶子节点（Leaf）
class Leaf(Component):
    def operation(self):
        print("Leaf operation")
        pass

# 组合节点（Composite）
class Composite(Component):
    def __init__(self):
        self.children = []

    def operation(self):
        print("Composite operation")
        for child in self.children:
            child.operation()

    def add(self, component):
        self.children.append(component)

    def remove(self, component):
        self.children.remove(component)

    def get_child(self, index):
        return self.children[index]

# 客户端（Client）
if __name__ == "__main__":
    # 创建组合对象
    root = Composite()
    # 创建叶子节点
    leaf1 = Leaf()
    leaf2 = Leaf()
    # 创建组合节点
    composite1 = Composite()
    composite2 = Composite()
    # 添加子节点
    root.add(leaf1)
    root.add(composite1)
    composite1.add(leaf2)
    composite1.add(composite2)
    # 遍历组合对象
    root.operation()